﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Data.OleDb;
using System.Data;

namespace GlobalTracker.WebSite.Core
{
  public class DatabaseAccess
  {
    private OleDbConnection connection;

    /// <summary>
    /// Construtor.
    /// </summary>
    public DatabaseAccess()
    {
    }

    /// <summary>
    /// Método responsável por realizar a conexão com o banco de dados.
    /// </summary>
    /// <returns>true = Conectou / false = Erro de Conexão</returns>
    public bool Connect()
    {
      string strConnection = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"].ToLower();

      // Instancia e abre conexão.          
      try
      {
        connection = new OleDbConnection(strConnection);
        connection.Open();
        return true;
      }
      catch (Exception exp)
      {
        connection.Dispose();
        throw exp;
      }
    }

    /// <summary>
    /// Método responsável por realizar a desconexão do banco de dados.
    /// </summary>
    /// <returns>true = Desconectou / false = Não conseguiu desconectar</returns>
    public bool Disconnect()
    {
      // Instancia e abre conexão.          
      try
      {
        connection.Close();
        connection.Dispose();
        return true;
      }
      catch (Exception exp)
      {
        connection.Dispose();
        throw exp;
      }
    }

    /// <summary>
    /// Método responsável por carregar e retornar um DataSet com a consulta passada.
    /// </summary>
    /// <param name="comand">Comando SQL</param>
    /// <returns>DataSet com o resultado do comando SQL. Retorna null se ocorreu erro.</returns>
    public DataSet GetDataSet(string command)
    {
      if (command.Trim().Length == 0)
        return null;

      DataSet dataSet = new DataSet();

      try
      {
        IDbDataAdapter dataAdapter = new OleDbDataAdapter();
        this.Connect();

        if (connection != null)
        {
          dataAdapter.SelectCommand = new OleDbCommand(command, connection);
          dataAdapter.Fill(dataSet);
          this.Disconnect();
        }
      }
      catch
      {
        dataSet = null;
        this.Disconnect();
      }

      return dataSet;
    }

    /// <summary>
    /// Método responsável por executar um comando SQL Insert, Delete ou Update.
    /// </summary>
    /// <param name="command">Comando SQL</param>
    /// <returns>Retorna uma string com a quantidade de registros afetados ou "Error" caso tenha ocorrido erro.</returns>   
    public string ExecuteCommand(string command)
    {
      if (command.Trim().Length == 0)
        return string.Empty;

      OleDbCommand sqlCommand = null;

      try
      {
        this.Connect();
        if (connection != null)
        {
          sqlCommand = new OleDbCommand(command, connection);
          string resultado = sqlCommand.ExecuteNonQuery().ToString();
          sqlCommand.Dispose();
          this.Disconnect();
          return resultado;
        }
        else
        {
          return "Não existe conexão com o banco de dados.";
        }
      }
      catch (Exception exp)
      {
        sqlCommand.Dispose();
        this.Disconnect();
        return "Erro: \r\n" + exp.Message.ToString();
      }
    }

    /// <summary>
    /// Método responsável por retornar a primeira coluna da primeira linha da consulta, indeal para consultas rápidas como count, sum, etc...
    /// </summary>
    /// <param name="command">Comando SQL</param>
    /// <returns>Valor retornado pela consulta ou "Error" caso tenha ocorrido erro. </returns>
    public string GetDataToString(string command)
    {
      string retorno = string.Empty;
      OleDbCommand sqlCommand = null;

      try
      {
        this.Connect();
        sqlCommand = new OleDbCommand(command, connection);
        retorno = sqlCommand.ExecuteScalar().ToString();
        sqlCommand.Dispose();
        this.Disconnect();
        return retorno;
      }
      catch (Exception exp)
      {
        sqlCommand.Dispose();
        this.Disconnect();
        return "Erro: \r\n" + exp.Message.ToString();
      }
    }

    public OleDbConnection CurrentConnection
    {
      get
      {
        return connection;
      }
    }
  }
}